home *** CD-ROM | disk | FTP | other *** search
/ Amiga Collections: Franz PD / Franz PD Disk #281 (1993)(Rhein-Sieg-Soft).zip / Franz PD Disk #281 (1993)(Rhein-Sieg-Soft).adf / Create / Create.S < prev    next >
Text File  |  1993-07-27  |  8KB  |  206 lines

  1. ;************** Create <name>,b1,b2,... *************** 
  2. ;*                                                    *
  3. ;*  Erstellt eine Datei mit dem Namen <name> und be-  *
  4. ;*  liebigen Bytes, die - mit Kommas getrennt - auf-  *
  5. ;*  gezählt werden.                                   *
  6. ;*                                                    *
  7. ;******************************************************
  8. ;*            ©  1991 by Michael Gottwald             *
  9. ;******************************************************
  10.  
  11. OpenLib  = -408                      ; EXEC-Library
  12. CloseLib = -414                      ;     '
  13. Open     = -30                       ; DOS-Library
  14. Close    = -36                       ;     '
  15. Write    = -48                       ;     '
  16. Output   = -60
  17. Exit     = -144                      ;     '
  18.  
  19. ;----Librarys öffnen--------------------------------------------------
  20.  
  21. run:     move.l  a0,Pointer          ; Zeiger auf Parametertext retten
  22.          move.l  d0,ErrAdr           ; Parametertextlänge retten
  23.          move.l  $4,a6
  24.          lea     Dosname,a1
  25.          jsr     OpenLib(a6)         ; dos.library öffnen
  26.          move.l  d0,DosBase
  27.          bne     getName             ; O.k, --> weiter
  28.  
  29.          rts                         ; Fehler beim Öffnen, --> CLI
  30.  
  31. ;----Dateinamen holen ------------------------------------------------
  32.  
  33. getName: move.l  Pointer,a0
  34.          subq.l  #1,ErrAdr           ; Kommen Parameter (ErrAdr = 1) ?
  35.          bne     noSpace             ; ja, --> weiter
  36.  
  37.          move.l  #NoParErr,ErrAdr    ; nein, --> Befehlsschablone
  38.          bra     error               ;           ausgeben und Ende
  39.  
  40. noSpace: cmp.b   #32,(a0)+
  41.          beq     noSpace             ; Leerzeichen überlesen...
  42.          move.l  #FileName,a1
  43.          subq.l  #1,a0
  44.          cmp.b   #44,(a0)            ; kommt schon Komma ?
  45.          bne     chkRet              ; nein, --> weiter
  46.  
  47.          move.l  #NoFileErr,ErrAdr
  48.          bra     Error               ; ja, --> Fehlermeldung ausgeben
  49.  
  50. chkRet:  cmp.b   #10,(a0)            ; kommt schon Line_feed ?
  51.          bne     readNme             ; nein, --> Zieldatei holen
  52.  
  53.          move.l  #NoFileErr,ErrAdr
  54.          bra     Error               ; ja, --> Fehlermeldung ausgeben
  55.  
  56. readNme: move.b  (a0)+,(a1)+         ; Zeichen speichern...
  57.          cmp.b   #44,(a0)            ; kommt Komma ?
  58.          beq     openFile            ; ja, --> Zieldatei öffnen
  59.          cmp.b   #10,(a0)            ; kommt Line_feed ?
  60.          bne     readNme             ; nein, --> weiterlesen
  61.  
  62. btError: move.l  #NoBytErr,ErrAdr
  63.          bra     Error               ; LF, --> Fehlermeldung ausgeben
  64.  
  65. openFile: addq.l #1,a0
  66.          move.l  a0,Pointer          ; Zeiger auf Parametertext retten
  67.          move.l  DosBase,a6
  68.          move.l  #FileName,d1        ; Zeiger auf Dateidefinition
  69.          move.l  #1006,d2            ; Modus 'new'
  70.          jsr     Open(a6)            ; Datei öffnen
  71.          move.l  d0,Handle           ; Dateihandle retten
  72.          bne     getByte             ; hat geklappt, --> Byte holen
  73.  
  74.          move.l  #OpenErr,ErrAdr
  75.          bra     error               ; hat nicht geklappt, --> Fehler
  76.  
  77. ;----Dezimalzahl holen -----------------------------------------------
  78.  
  79. getByte: move.l  Pointer,a0          ; Zeiger auf Textpuffer holen
  80. nextByte:bsr     getdez              ; Dezimalzahl (Byte) holen
  81.          cmp.w   #255,d0             ; kleiner/gleich 255 ?
  82.          bls     WrFile              ; ja, --> weiter
  83.  
  84.          move.l  #ByteErr,ErrAdr
  85.          bra     error               ; --> Fehlermeldung ausgeben
  86.  
  87. WrFile:  move.l  a0,Pointer          ; Parametertext-Zeiger retten
  88.          move.l  DosBase,a6
  89.          move.b  d0,Byte
  90.          move.l  #Byte,d2            ; Zeiger auf Byte...
  91.          move.l  Handle,d1           ; Dateihandle...
  92.          move.l  #1,d3               ; Länge: 1
  93.          jsr     Write(a6)           ; Byte schreiben
  94.          tst.l   d0                  ; D0 testen
  95.          bmi     WrError             ; negativ, --> Schreibfehler
  96.          move.l  Pointer,a0          ; Param.text-Zeiger zurückholen
  97.          cmp.b   #44,(a0)+           ; kommt Komma ?
  98.          beq     nextByte            ; ja, --> nächstes Byte holen
  99.          subq.l  #1,a0               ; nein, --> Zeiger zurückbiegen
  100.          cmp.b   #10,(a0)            ; kommt Line_feed ?
  101.          bra     end                 ; ja, --> Ende
  102.  
  103.          move.l  #SyntaxErr,ErrAdr
  104.          bra     error               ; nein, --> Fehler
  105.  
  106. wrError: move.l  #WriteErr,ErrAdr
  107.          bra     error               ; --> Fehler
  108.  
  109. end:     move.l  DosBase,a6
  110.          move.l  Handle,d1
  111.          jsr     Close(a6)           ; Datei schließen
  112.          move.l  DosBase,a6
  113.          clr.l   d1                  ; Returncode = 0 (kein Fehler)
  114.          jsr     Exit(a6)            ; zurück ins CLI
  115.  
  116. ;----Dezimalzahl auswerten--------------------------------------------
  117.  
  118. getdez:  cmp.b   #32,(a0)+           ; Leerzeichen überlesen
  119.          beq     getdez
  120.          clr.l   d0
  121.          subq.l  #1,a0
  122.          move.l  #2,d1               ; Ziffernzähler setzen
  123.          clr.w   Numbers
  124. loop2:   move.b  (a0)+,d0            ; nächstes Zeichen holen
  125.          cmp.b   #10,d0              ; Line_feed ?
  126.          beq     back                ;  dann keine Ziffer mehr
  127.          cmp.b   #44,d0              ; Komma ?
  128.          beq     back                ;  dann keine Ziffer mehr
  129.          lea     Numbers,a1          ; Basisadresse der Zifferspeicher
  130.          add.l   d1,a1
  131.          sub.l   #48,d0              ; ASCII-Code - 48 = Zifferwert
  132.          move.b  d0,(a1)             ; Ziffer abspeichern
  133.          dbra    d1,loop2            ; D1 dekrementieren / D1 = 0 ?
  134.          bra     ready
  135. back:    subq.l  #1,a0               ; A0 auf Komma biegen
  136. ready:   addq.w  #1,d1
  137.          clr.l   d0
  138.          cmp.b   #3,d1               ; D1 noch 2 ?
  139.          bne     cont
  140.  
  141.          add.l   #4,a7               ; ja, dann keine Ziffer gefunden
  142.          move.l  #NoBytErr,ErrAdr
  143.          bra     error               ; --> Fehlermeldung ausgeben
  144.  
  145. cont:    lea     Muls,a2             ; Basisadr. der Multiplikatoren
  146.          add.l   d1,a2
  147.          lea     Numbers,a1
  148.          clr.l   d0
  149.          clr.l   d1
  150.          clr.l   d2
  151.          move.b  2(a1),d0            ; /Beide Bytes holen, damit wort-
  152.          move.b  (a2),d1             ; \weise multipliz. werden kann
  153.          mulu    d1,d0               ; 1. Ziffer * Multiplikator
  154.          addq.l  #1,a2
  155.          move.b  1(a1),d1
  156.          move.b  (a2),d2
  157.          mulu    d2,d1               ; 2. Ziffer (falls vorhanden)
  158.          add.w   d1,d0
  159.          move.b  (a1),d1
  160.          add.w   d1,d0               ; + 1. Ziffer (falls vorhanden)
  161.          rts                         ; zurück (D0 enthält Dezimalzahl)
  162.  
  163. ;----Fehlermeldung ausgeben-------------------------------------------
  164.  
  165. error:   tst.l   Handle              ; Filehandle = 0 ?
  166.          beq     TxtOut              ; ja, --> kein CLOSE
  167.          move.l  Handle,d1
  168.          move.l  DosBase,a6
  169.          jsr     Close(a6)           ; Datei schließen
  170. TxtOut:  move.l  DosBase,a6
  171.          jsr     Output(a6)          ; Standard-Ausgabekanal ermitteln
  172.          move.l  d0,ErrHandle
  173.          move.l  d0,d1
  174.          clr.l   d3
  175.          move.l  ErrAdr,a0
  176.          move.b  (a0)+,d3            ; Länge des Fehlertextes holen
  177.          move.l  a0,d2               ; Fehlertext-Adresse
  178.          move.l  DosBase,a6
  179.          jsr     Write(a6)           ; Fehlertext ausgeben
  180.          move.l  #1,d1               ; Return-Code = Fehler
  181.          move.l  DosBase,a6
  182.          jsr     Exit(a6)            ; zurück ins CLI
  183.  
  184. ;---------------------------------------------------------------------
  185.    even
  186. DosName:  dc.b "dos.library",0
  187. DosBase:  dc.l 0
  188. Pointer:  dc.l 0
  189. Handle:   dc.l 0
  190. ErrHandle:dc.l 0
  191. ErrAdr:   dc.l 0
  192. Numbers:  dc.b 0,0,0                ; Ziffernspeicher
  193. Muls:     dc.b 100,10,1,1           ; Multiplikatoren
  194.  even
  195. FileName: blk.b 100,0               ; Speicher für Zieltext
  196. Byte:     dc.b 0
  197.  
  198. ComErr:    dc.b 19,"Ein Komma fehlt !",13,10
  199. OpenErr:   dc.b 32,"Datei läßt sich nicht öffnen !",13,10
  200. WriteErr:  dc.b 25,"Fehler beim Schreiben !",13,10
  201. ByteErr:   dc.b 31,"Ein Byte ist größer als 255 !",13,10
  202. NoBytErr:  dc.b 21,"Vermisse Byte(s)...",13,10
  203. NoFileErr: dc.b 35,"Bitte Zieldatei nicht vergessen !",13,10
  204. NoParErr:  dc.b 35,"--> CREATE <ziel>,byte[,byte,...]",13,10
  205. SyntaxErr: dc.b 43,"Eine Dezimalzahl hat mehr als 3 Ziffern !",13,10
  206.